package com.yk._17可重入锁;


import java.util.concurrent.TimeUnit;

/**
 * 实现原理实现是通过为每个锁关联一个请求计数器和一个占有它的线程。
 * 当计数为0时，认为锁是未被占有的；线程请求一个未被占有的锁时
 * ，JVM将记录锁的占有者，并且将请求计数器置为1 。
 *
 * 如果同一个线程再次请求这个锁，计数器将递增；
 *
 * 每次占用线程退出同步块，计数器值将递减。直到计数器为0,锁被释放
 */
public class _01ReentrantLock {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(()->{
            phone.sms();
        },"线程A").start();

        new Thread(()->{
            phone.call();
        },"线程B").start();
    }
}

class Phone{

    public synchronized void sms(){
        System.out.println(Thread.currentThread().getName()+" 发短信");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        call();
    }

    public synchronized void call(){
        System.out.println(Thread.currentThread().getName()+" 打电话");
    }
}

